package com.atguigu.jxc.service.impl;

import com.atguigu.jxc.dao.GoodsDao;
import com.atguigu.jxc.dao.GoodsTypeDao;
import com.atguigu.jxc.domain.ErrorCode;
import com.atguigu.jxc.domain.ServiceVO;
import com.atguigu.jxc.domain.SuccessCode;
import com.atguigu.jxc.entity.GoodsType;
import com.atguigu.jxc.service.GoodsTypeService;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName GoodsTypeServiceImpl
 * @Author 波
 * @Date 2024/9/24 16:01
 */
@Service
public class GoodsTypeServiceImpl implements GoodsTypeService {
    @Autowired
    private GoodsTypeDao goodsTypeDao;
    @Autowired
    private GoodsDao goodsDao;

    @Override
    @SneakyThrows
    public String loadGoodsType() {
        ObjectMapper objectMapper = new ObjectMapper();
        //先查询所有的商品分类
        List<GoodsType> goodsTypeList = goodsTypeDao.loadGoodsType();
        List<ObjectNode> parents = buildTree(goodsTypeList, -1);
        return objectMapper.writeValueAsString(parents);
    }


    /**
     * 构建树
     *
     * @param goodsTypeList
     * @param pId
     * @return
     */
    private List<ObjectNode> buildTree(List<GoodsType> goodsTypeList, int pId) {
        ObjectMapper objectMapper = new ObjectMapper();
        ArrayList<ObjectNode> nodes = new ArrayList<>();
        for (GoodsType goodsType : goodsTypeList) {
            if (goodsType.getPId() == pId) {
                ObjectNode objectNode = createJsonObject(goodsType);
                List<ObjectNode> children = buildTree(goodsTypeList, goodsType.getGoodsTypeId());

                if (!children.isEmpty()) {
                    objectNode.set("children", objectMapper.valueToTree(children));
                }
                nodes.add(objectNode);
            }
        }
        return nodes;
    }

    /**
     * 创建json对象
     *
     * @param goodsType
     * @return
     */
    private ObjectNode createJsonObject(GoodsType goodsType) {
        ObjectMapper objectMapper = new ObjectMapper();
        ObjectNode objectNode = objectMapper.createObjectNode();
        objectNode.put("id", goodsType.getGoodsTypeId());
        objectNode.put("text", goodsType.getGoodsTypeName());
        Integer state = goodsType.getGoodsTypeState();
        objectNode.put("state", state == 1 ? "closed" : "open");

        //attributes也是一个json对象
        ObjectNode attr = objectMapper.createObjectNode();
        attr.put("state", state);
        objectNode.set("attributes", attr);
        objectNode.put("iconCls", "goods-type");

        return objectNode;
    }

    /**
     * 新建分类
     *
     * @param goodsTypeName
     * @param pId
     */
    @Override
    public void save(String goodsTypeName, Integer pId) {
        GoodsType goodsType = new GoodsType();
        //现根据pid查一下看是否是目录
        int count = goodsTypeDao.getTypeState(pId);
        if (count == 0) {
            goodsType = new GoodsType();
            goodsType.setGoodsTypeState(1);
            goodsType.setGoodsTypeId(pId);
            //更新该节点为目录
            goodsTypeDao.updateGoodsTypeState(goodsType);
        }
        goodsType.setGoodsTypeName(goodsTypeName);
        goodsType.setPId(pId);
        goodsType.setGoodsTypeState(0);
        goodsTypeDao.save(goodsType);
    }

    @Override
    public ServiceVO delete(Integer goodsTypeId) {
        //先查查询该商品分类下是否有商品
        int count = goodsDao.getCountByGoodsTypeId(goodsTypeId);
        if (count > 0) {
            return new ServiceVO(ErrorCode.GOODS_TYPE_ERROR_CODE, ErrorCode.GOODS_TYPE_ERROR_MESS);
        }
        GoodsType goodsType = goodsTypeDao.getGoodsTypeById(goodsTypeId);
        //根据pid查询该节点是否还有子节点
        List<GoodsType> goodsTypeList = goodsTypeDao.getGoodsTypeListByPid(goodsType.getPId());
        if (goodsTypeList.size() == 1) {
            //如果只有一个子节点，则更新该子节点的pid为父节点的pid
            GoodsType parentGoodsType = goodsTypeDao.getGoodsTypeById(goodsType.getPId());
            parentGoodsType.setGoodsTypeState(0);
            goodsTypeDao.updateGoodsTypeState(parentGoodsType);
            goodsTypeDao.delete(goodsTypeId);
        } else {
            //否则直接删除该节点
            goodsTypeDao.delete(goodsTypeId);
        }
        return new ServiceVO(SuccessCode.SUCCESS_CODE, SuccessCode.SUCCESS_MESS);
    }
}
